利用其他 Collection 構建 ArrayList:
public ArrayList(Collection<? extends E> c) {
? ? elementData = c.toArray();
? ? if ((size = elementData.length) != 0) {
? ? ? ? // c.toArray might (incorrectly) not return Object[] (see 6260652)
? ? ? ? if (elementData.getClass() != Object[].class)
? ? ? ? ? ? elementData = Arrays.copyOf(elementData, size, Object[].class);
? ? } else {
? ? ? ? // replace with empty array.
? ? ? ? this.elementData = EMPTY_ELEMENTDATA;
? ? }
}
Collection<? extends E> c的含義:
- 實現了Collection接口
- <? extends E>: 你傳入的數據,泛型E自己后者E的子類
指定順序表初始容量:
public ArrayList(int initialCapacity) {
? ? if (initialCapacity > 0) {
? ? ? ? this.elementData = new Object[initialCapacity];
? ? } else if (initialCapacity == 0) {
? ? ? ? this.elementData = EMPTY_ELEMENTDATA;
? ? } else {
? ? ? ? throw new IllegalArgumentException("Illegal Capacity: "+
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?initialCapacity);
? ? }
}
指定容量等于0 根據之前分析的源碼可知add時 if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)這個判斷不會進入,第一次增加后增容的大小是1,然后一直是1.5倍的大小新增。
? ? 指定容量大于0 創建一個指定容量的數組
? ? 指定容量等于0 指向EMPTY_ELEMENTDATA(是一個大小為0的數組)
? ? 指定容量等于0 add時第一次增加后增容的大小是1,然后一直是1.5倍的大小新增。
? ? 指定容量小于0 拋出異常
創建ArrayList
public static void main(String[] args) {
? ? // ArrayList創建,推薦寫法
? ? // 構造一個空的列表
? ? List<Integer> list1 = new ArrayList<>();
? ? // 構造一個具有10個容量的列表
? ? List<Integer> list2 = new ArrayList<>(10);
? ? list2.add(1);
? ? list2.add(2);
? ? list2.add(3);
? ? // list2.add("hello"); // 編譯失敗,List<Integer>已經限定了,list2中只能存儲整形元素
? ? // list3構造好之后,與list中的元素一致
? ? List<Integer> list3 = new ArrayList<>(list2);
? ? // 避免省略類型,否則:任意類型的元素都可以存放,使用時將是一場災難
? ? List list4 = new ArrayList();
? ? list4.add("111");
? ? list4.add(100);
}
通過idea查看四個list中的數據
?